//
//  DMAdjustManager.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/8/5.
//

#import <Foundation/Foundation.h>
#import <AdjustSdk/AdjustSdk.h>
#import "DMAdjustAttributionInfo.h"

NS_ASSUME_NONNULL_BEGIN

@class DMAdjustManager;

#pragma mark - DMAdjustDelegate Protocol

/**
 * Adjust事件回调协议
 */
@protocol DMAdjustDelegate <NSObject>

@optional
/**
 * Adjust归因结果回调接口（SDK统一回调）
 * @param isSuccess 归因是否成功
 */
- (void)onAdjustCallBack:(BOOL)isSuccess;

/**
 * 归因信息变更回调
 * @param attributionInfo 归因信息
 */
- (void)onAdjustAttributionChanged:(DMAdjustAttributionInfo *)attributionInfo;

@end

#pragma mark - DMAdjustManager

/**
 * Adjust事件管理器
 * 提供Adjust事件上报、归因回调处理等功能
 */
@interface DMAdjustManager : NSObject

/// 代理对象
@property (nonatomic, weak, nullable) id<DMAdjustDelegate> delegate;

#pragma mark - Singleton

/**
 * 获取单例实例
 * @return DMAdjustManager单例
 */
+ (instancetype)sharedManager;

/**
 * 兼容旧接口的单例方法
 * @return DMAdjustManager单例
 */
+ (instancetype)shareAdjustManager DEPRECATED_MSG_ATTRIBUTE("Use sharedManager instead");

#pragma mark - Configuration

/**
 * 使用配置文件初始化Adjust（内部从DMConfigReader读取app_token）
 */
- (void)AdjustConfigInit;

/**
 * 使用App Token配置Adjust
 * @param appToken Adjust应用Token
 */
- (void)configureWithAppToken:(NSString *)appToken;

/**
 * 兼容旧接口的配置方法
 */
- (void)adjustConfig DEPRECATED_MSG_ATTRIBUTE("Use configureWithAppToken: instead");

#pragma mark - Event Tracking

/**
 * 上报Adjust事件（同步方式）
 * @param eventId 事件ID
 */
- (void)trackAdjustEvent:(NSString *)eventId;

/**
 * 上报Adjust事件（异步方式，推荐）
 * @param eventId 事件ID
 * @param completion 完成回调
 */
- (void)trackAdjustEvent:(NSString *)eventId completion:(nullable void(^)(BOOL success, NSString * _Nullable errorMessage))completion;

/**
 * 兼容旧接口的事件上报方法
 * @param event Adjust事件对象
 */
- (void)adjustEvent:(ADJEvent *)event DEPRECATED_MSG_ATTRIBUTE("Use trackAdjustEvent: instead");

/**
 * 兼容旧接口的自定义事件上报方法
 * @param cid 自定义ID
 */
- (void)adjustCustomEventWithCustomId:(NSString *)cid DEPRECATED_MSG_ATTRIBUTE("Use trackAdjustEvent: instead");

#pragma mark - Attribution Info

/**
 * 获取归因推广活动名称
 * @return 推广活动名称，无归因信息时返回"Organic"
 */
- (NSString *)getUserPropertyCampaign;

/**
 * 获取归因素材名称（按"_"分割取最后部分）
 * @return 素材名称，无归因信息时返回"Organic"
 */
- (NSString *)getUserPropertyCreative;

/**
 * 获取当前归因信息
 * @return 当前的归因信息对象
 */
- (nullable DMAdjustAttributionInfo *)getCurrentAttribution;

#pragma mark - Attribution Callback

/**
 * 设置归因回调
 * @param callback 归因回调block
 */
- (void)setAttributionCallback:(nullable void(^)(BOOL isSuccess))callback;

#pragma mark - Status Check

/**
 * 检查Adjust是否已初始化
 * @return 是否已初始化
 */
- (BOOL)isAdjustInitialized;

#pragma mark - Deprecated Properties

/// 兼容旧接口的回调block（已废弃）
@property (nonatomic, copy, nullable) void(^adjustCallBackBlcok)(BOOL isSuccess) DEPRECATED_MSG_ATTRIBUTE("Use setAttributionCallback: instead");

/// 兼容旧接口的推广活动名称（已废弃）
@property (nonatomic, strong, nullable) NSString *adjustCampaign DEPRECATED_MSG_ATTRIBUTE("Use getUserPropertyCampaign instead");

/// 兼容旧接口的素材名称（已废弃）
@property (nonatomic, strong, nullable) NSString *adjustCreative DEPRECATED_MSG_ATTRIBUTE("Use getUserPropertyCreative instead");

@end

NS_ASSUME_NONNULL_END
